package com.javaweb.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @desc: TODO: 使用注解 @NPECatch, 并使用@within, @annotation
 *            实现对类级别或方法级别的方法执行中的异常进行统一捕获处理。
 *            处理的逻辑为，输出在控制台。
 * @author:
 * @date:
 */

@Aspect
@Component
@Slf4j
public class NullExceptionAspect {

    // 定义切点，匹配类或方法上的@NPECatch注解
    @Pointcut("@within(com.javaweb.aop.NPECatch) || @annotation(com.javaweb.aop.NPECatch)")
    public void npeCatchMethods() {}


    @AfterThrowing(pointcut = "npeCatchMethods()", throwing = "ex")
    public void afterThrowing(JoinPoint joinPoint, Throwable ex) {
        log.error("npeCatchMethods   " + "Method:"+joinPoint.getSignature().getName()
                + " met an error: " + ex.getMessage());
    }

}
